/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.perutaxi.clie;

import com.perutaxi.entidades.eCliente;
import com.perutaxi.entidades.eClienteReclamo;
import com.perutaxi.entidades.eClienteServicio;
import com.perutaxi.entidades.eEmpresaTaxista;
import com.perutaxi.entidades.eUsuario;
import com.perutaxi.negocio.nCliente;
import com.perutaxi.negocio.nClienteReclamo;
import com.perutaxi.negocio.nClienteServicio;
import com.perutaxi.negocio.nEmpresaTaxista;
import com.perutaxi.negocio.nUsuario;
import com.perutaxi.util.GenericMBean;
import com.perutaxi.util.JavaMail;
import java.io.Serializable;
import java.sql.Timestamp;
import java.util.Date;
import java.util.List;
import java.util.StringTokenizer;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import org.primefaces.context.RequestContext;

/**
 *
 * @author PeruTaxi
 */
@ManagedBean
@SessionScoped
public class ClienteMBean extends GenericMBean implements Serializable {

    private eCliente clienteFiltro;
    private eCliente cliente;
    private List<eCliente> lista;
    private int accion; //1:nuevo, 2:editar, 3:ver
    private int accionDetalle;
    private String tituloDetalle;
    private String titulo; //titulo del panel
    private final String url = "/pages/clie/cliente/cliente.xhtml";
    private final String urlLista = "/pages/clie/cliente/listaCliente.xhtml";
    private Date fechaNacimiento;
    private SelectItem[] siEstadosSexo;
    private List<eClienteReclamo> listaReclamos;
    private eClienteReclamo reclamo;
    private List<eClienteServicio> listaServicios;
    private eClienteServicio servicio;
    private List<eEmpresaTaxista> listaTaxistas;
    private Long idTaxista;
    private Date fechaServicio;

    public ClienteMBean() {
    }

    public String iniciar() {
        clienteFiltro = new eCliente();
        clienteFiltro.setDni("");
        clienteFiltro.setEstado(Boolean.TRUE);
        lista = null;

        return this.urlLista;
    }

    public void buscar(ActionEvent ae) {
        try {
            this.lista = nCliente.obtenerCliente(this.clienteFiltro);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public String nuevo() {
        this.accion = 1;
        this.titulo = "NUEVO CLIENTE";
        this.cliente = nCliente.inicializar();

        return this.url;
    }

    public void nuevoServicio() {
        this.accionDetalle = 1;
        this.tituloDetalle = "NUEVO SERVICIO";
        this.fechaServicio = null;
        this.servicio = nClienteServicio.inicializar();
        this.servicio.setCliente(this.cliente);
    }

    public String editar() {
        this.accion = 2;
        this.titulo = "ACTUALIZAR CLIENTE";

        return this.url;
    }

    public void editarServicio() {
        this.accionDetalle = 2;
        this.tituloDetalle = "ACTUALIZAR SERVICIO";
        if (this.servicio.getId() != null) {
            try {
                this.servicio = nClienteServicio.obtenerPorId(this.servicio.getId());
            } catch (Exception e) {
                showError(e.getMessage());
            }
        }
    }

    public String ver() {
        this.accion = 3;
        this.titulo = "VER CLIENTE";

        return this.url;
    }

    public void verServicio() {
        this.accionDetalle = 3;
        this.tituloDetalle = "VER SERVICIO";
        if (this.servicio.getId() != null) {
            try {
                this.servicio = nClienteServicio.obtenerPorId(this.servicio.getId());
            } catch (Exception e) {
                showError(e.getMessage());
            }
        }
    }

    public String guardar() {
        try {
            if (this.accion == 1) {
                Long id = Long.valueOf(nCliente.obtenerTodos().size() + 1);
                this.cliente.setId(id);
                this.cliente = generarUsuario(this.cliente);
                nUsuario.guardar(this.cliente.getUsuario());
                if (nCliente.guardar(this.cliente)) {
                    this.cliente = nCliente.obtenerPorId(this.cliente.getId());
                    enviarNotificacion(this.cliente);
                    showMessage("SE HA GUARDADO CORRECTAMENTE");
                    return this.editar();
                } else {
                    showError("ERROR AL MOMENTO DE GUARDAR");
                    return null;
                }
            } else {
                if (nCliente.actualizar(this.cliente)) {
                    this.cliente = nCliente.obtenerPorId(this.cliente.getId());
                    showMessage("SE HA GUARDADO CORRECTAMENTE");
                    return this.editar();
                } else {
                    showError("ERROR AL MOMENTO DE GUARDAR");
                    return null;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public void guardarServicio() {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = true;
        try {
            if (this.accionDetalle == 1) {
                Long id = Long.valueOf(nClienteServicio.obtenerTodos().size() + 1);
                this.servicio.setId(id);
                this.servicio.setTaxista(nEmpresaTaxista.obtenerPorId(this.idTaxista));
                this.servicio.setFechaServicio(new Timestamp(this.fechaServicio.getTime()));
                if (nClienteServicio.guardar(this.servicio)) {
                    this.cliente.setNroServicios(this.cliente.getNroServicios() + 1);
                    nCliente.actualizar(this.cliente);
                    this.cliente = nCliente.obtenerPorId(this.cliente.getId());
                } else {
                    resultado = false;
                }
            } else {
                if (nClienteServicio.actualizar(this.servicio)) {
                    this.cliente = nCliente.obtenerPorId(this.cliente.getId());
                } else {
                    resultado = false;
                }
            }
        } catch (Exception e) {
            showError(e.getMessage());
        }
        context.addCallbackParam("CallbackParam", resultado);
    }

    private void enviarNotificacion(eCliente cliente) {
        String asunto = "CONFIRMACIÓN DE REGISTRO";
        String mensaje = "ESTIMADO USUARIO, PERUTAXI AGRADECE SU PREFERENCIA. SU USUARIO PARA EL INGRESO A LA WEB ES: " + cliente.getUsuario().getUsuario();
        mensaje += " Y SU CLAVE ES: " + cliente.getUsuario().getClave();
        JavaMail.send(cliente.getEmailPersonal(), asunto, mensaje);
    }

    private eCliente generarUsuario(eCliente cliente) throws Exception {
        eUsuario usuario = new eUsuario();
        Long id = Long.valueOf(nUsuario.obtenerTodos().size() + 1);
        StringTokenizer tokens = new StringTokenizer(cliente.getNombres());
        String clave = id + tokens.nextToken();
        usuario.setId(id);
        usuario.setUsuario(cliente.getDni());
        usuario.setClave(clave);
        usuario.setIdRol(3L);
        usuario.setEstado(Boolean.TRUE);

        cliente.setUsuario(usuario);

        return cliente;
    }

    public String retroceder() {
        buscar(null);
        return this.urlLista;
    }

    public eCliente getClienteFiltro() {
        return clienteFiltro;
    }

    public void setClienteFiltro(eCliente clienteFiltro) {
        this.clienteFiltro = clienteFiltro;
    }

    public eCliente getCliente() {
        return cliente;
    }

    public void setCliente(eCliente cliente) {
        this.cliente = cliente;
    }

    public List<eCliente> getLista() {
        return lista;
    }

    public void setLista(List<eCliente> lista) {
        this.lista = lista;
    }

    public int getAccion() {
        return accion;
    }

    public void setAccion(int accion) {
        this.accion = accion;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public Date getFechaNacimiento() {
        if (this.accion == 1) {
            return this.fechaNacimiento;
        } else {
            return this.cliente.getFechaNacimiento();
        }
    }

    public void setFechaNacimiento(Date fechaNacimiento) {
        this.fechaNacimiento = fechaNacimiento;
        this.cliente.setFechaNacimiento(new Timestamp(this.fechaNacimiento.getTime()));
    }

    public SelectItem[] getSiEstadosSexo() {
        SelectItem[] si = new SelectItem[3];
        si[0] = new SelectItem("H", "HOMBRE");
        si[1] = new SelectItem("M", "MUJER");
        si[2] = new SelectItem("O", "OTRO");
        siEstadosSexo = si;

        return siEstadosSexo;
    }

    public void setSiEstadosSexo(SelectItem[] siEstadosSexo) {
        this.siEstadosSexo = siEstadosSexo;
    }

    public List<eClienteReclamo> getListaReclamos() throws Exception {
        return nClienteReclamo.obtenerPorIdCliente(this.cliente.getId());
    }

    public void setListaReclamos(List<eClienteReclamo> listaReclamos) {
        this.listaReclamos = listaReclamos;
    }

    public eClienteReclamo getReclamo() {
        return reclamo;
    }

    public void setReclamo(eClienteReclamo reclamo) {
        this.reclamo = reclamo;
    }

    public List<eClienteServicio> getListaServicios() throws Exception {
        return nClienteServicio.obtenerPorIdCliente(this.cliente.getId());
    }

    public void setListaServicios(List<eClienteServicio> listaServicios) {
        this.listaServicios = listaServicios;
    }

    public eClienteServicio getServicio() {
        return servicio;
    }

    public void setServicio(eClienteServicio servicio) {
        this.servicio = servicio;
    }

    public int getAccionDetalle() {
        return accionDetalle;
    }

    public void setAccionDetalle(int accionDetalle) {
        this.accionDetalle = accionDetalle;
    }

    public String getTituloDetalle() {
        return tituloDetalle;
    }

    public void setTituloDetalle(String tituloDetalle) {
        this.tituloDetalle = tituloDetalle;
    }

    public List<eEmpresaTaxista> getListaTaxistas() throws Exception {
        return nEmpresaTaxista.obtenerActivos();
    }

    public void setListaTaxistas(List<eEmpresaTaxista> listaTaxistas) {
        this.listaTaxistas = listaTaxistas;
    }

    public Long getIdTaxista() {
        return idTaxista;
    }

    public void setIdTaxista(Long idTaxista) {
        this.idTaxista = idTaxista;
    }

    public Date getFechaServicio() {
        if (this.accionDetalle == 2 || this.accionDetalle == 3) {
            return this.servicio.getFechaServicio();
        }

        return fechaServicio;
    }

    public void setFechaServicio(Date fechaServicio) {
        this.fechaServicio = fechaServicio;
    }
}